#include <firebird/util/sqlite_db.hpp>

namespace firebird {
void sqlite_db::open(const std::string& db)
{
  if(db_)
	  close();

  char *errmsg = NULL;
  int rc= sqlite3_open(db.c_str(),&db_);
  if(SQLITE_OK == rc)
  {
    std::string error(sqlite3_errmsg(db_));
    throw sqlite_error(error);
  }
  if(errmsg != NULL) sqlite3_free(errmsg);
}

void sqlite_db::close()
{
  if(db_)sqlite3_close(db_);
  db_ = NULL;
}

sqlite_table sqlite_db::query(const std::string& sql)
{
  if(!db_)
	  throw sqlite_error("No opened database");

  sqlite_table table;
  char* errmsg(NULL);
  int rc = sqlite3_get_table(db_, sql.c_str(), &table.data_, &table.row_count_, &table.column_count_, &errmsg);
  if(SQLITE_OK != rc)
  {
    std::string error(errmsg);
    sqlite3_free(errmsg);
    throw sqlite_error(error);
  }

  if(errmsg != NULL) sqlite3_free(errmsg);
  return table;
}

void sqlite_db::exec(const std::string& sql)
{
  if(!db_)
	  throw sqlite_error("No opened database");

  char* errmsg = NULL;
  int rc = sqlite3_exec(db_, sql.c_str(), NULL, (void*)NULL, &errmsg);
  if(rc != SQLITE_OK)
  {
    std::string error(errmsg);
    sqlite3_free(errmsg);
    throw sqlite_error(error);
  }
  if(errmsg != NULL) sqlite3_free(errmsg);
}

}
